package xin.altitude.java.util;

import java.util.Comparator;
import java.util.function.Supplier;

/**
 * <p>{@link java.util.Objects}类中文注释版</p>
 * <p>如果其它框架实现了与本工具类相同的功能 优先选用本工具类 JDK内置工具类执行效率更高</p>
 *
 * @author <a href="http://www.altitude.xin" target="_blank">Java知识图谱</a>
 * @author <a href="https://gitee.com/decsa/ucode-cms-vue" target="_blank">UCode CMS</a>
 * @author <a href="https://space.bilibili.com/1936685014" target="_blank">B站视频</a>
 **/
public class Objects {
    /**
     * <p>通过<code>equals</code>判断两个对象是否相等</p>
     * 传统方式调用<code>equals</code>之前需要先判断非<code>null</code>
     * <pre>
     *     if (a != null && a.equals(b)) {
     *
     *     }
     * </pre>
     * 使用本方法可直接判断 不用考虑对象<code>null</code>问题
     * <pre>
     *     if (Objects.equals(a, b)) {
     *
     *     }
     * </pre>
     */
    public static boolean equals(Object a, Object b) {
        return java.util.Objects.equals(a, b);
    }
    
    public static boolean deepEquals(Object a, Object b) {
        return java.util.Objects.deepEquals(a, b);
    }
    
    public static int hashCode(Object o) {
        return java.util.Objects.hashCode(o);
    }
    
    public static int hash(Object... values) {
        return java.util.Objects.hash(values);
    }
    
    public static String toString(Object o) {
        return java.util.Objects.toString(o);
    }
    
    public static String toString(Object o, String nullDefault) {
        return java.util.Objects.toString(o, nullDefault);
    }
    
    public static <T> int compare(T a, T b, Comparator<? super T> c) {
        return java.util.Objects.compare(a, b, c);
    }
    
    /**
     * 本方法在写<i>框架代码</i>时比较实用 强制要求输入参数不能为<code>null</code> 否则抛出空指针异常
     */
    public static <T> T requireNonNull(T obj) {
        return java.util.Objects.requireNonNull(obj);
    }
    
    /**
     * <p>本方法在写<i>框架代码</i>时比较实用 强制要求输入参数不能为<code>null</code> 否则抛出空指针异常</p>
     * <p>允许自定义异常信息</p>
     */
    public static <T> T requireNonNull(T obj, String message) {
        return java.util.Objects.requireNonNull(obj, message);
    }
    
    public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) {
        return java.util.Objects.requireNonNull(obj, messageSupplier);
    }
    
    public static boolean isNull(Object obj) {
        return java.util.Objects.isNull(obj);
    }
    
    public static boolean nonNull(Object obj) {
        return java.util.Objects.nonNull(obj);
    }
}
